#include<bits/stdc++.h>
using namespace std;
const int len=1e5+5;
struct car{
    int d,v,a;
}ca[len];
int p[len];
int checkp[len];
int upper(int n,double dx) {
    int l=1,r=n;
    while(l<r) {
        int mid=(l+r)/2;
        if(p[mid]>=dx) r=mid;
        else l=mid+1;
    }
    return r;
}
int main() {
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int t;
    cin>>t;
    while(t--) {
        memset(checkp,0,sizeof(checkp));
        int n,m,L,V,ansc=0,ansp=0;
        scanf("%d %d %d %d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++) {
            scanf("%d %d %d",&ca[i].d,&ca[i].v,&ca[i].a);
        }
        for(int i=1;i<=m;i++) {
            scanf("%d",&p[i]);
        }
        for(int i=1;i<=n;i++) {
            if(ca[i].a==0) {
                if(ca[i].v>V&&ca[i].d<=p[m]) {
                    checkp[m]=1;
                    ansc++;
                }
            } else if(ca[i].a>0) {
                double tx=0,td=ca[i].d,tv0=ca[i].v,tv=V,ta=ca[i].a,tp=p[m];
                if(tv0<tv) {
                    tx=(tv*tv-tv0*tv0)/(2.0*ta);
                }
                tx+=td;
                if(tx<tp||tv0>tv&&tx==tp) {
                    checkp[m]=1;
                    ansc++;
                }
            } else {
                double tv=V;
                if(ca[i].v>tv) {
                    double tx,td=ca[i].d,tv0=ca[i].v,ta=-ca[i].a;
                    tx=(tv0*tv0-tv*tv)/(2.0*ta)+td;
                    int temp=upper(n,td);
                    if(p[temp]<tx) {
                        checkp[temp]=1;
                        ansc++;
                    }
                }
            }
        }
        for(int i=1;i<=m;i++) {
            if(!checkp[i]) ansp++;
        }
        cout<<ansc<<' '<<ansp<<endl;
    }
    return 0;
}
